#include <iostream>
using namespace std;

class Person
{
public:
    Person() = default;
    virtual ~Person() = default;
    virtual void speak() = 0;
    virtual void eat() =0;
    static int var4;
};

// Person::~Person()
// {
//     cout << "Person virtual ~Person is called." << endl;
// }

int Person::var4 = 2;

class Student : public Person
{
public:
    Student(){};
    void speak() override
    {
        cout << "student is speaking..." << endl;
    }
    virtual void jump() = 0;
};

class HignSchoolStu : public Student
{
public:
    HignSchoolStu(){};
    
    void speak() =0;
    void eat() override
    {
        cout << "Hign school student is eatting" << endl;
    }
    void jump() override
    {
        cout << "Hign school student is jumpping..." << endl;
    }
};

class HHSS : public HignSchoolStu
{
public:

    void speak() override
    {
        cout << "HHSS is speaking..." << endl;
    }
};

void func(char c, int a)
{
    
}

struct classDerivted
{
    typedef void (*funptr) (char, int);
    funptr pfunc1 = func;
};

class myTestC {
public:
    myTestC() {in = 2;}
    int in;
};

void test(int a, myTestC stu) {
    cout << " test functinon ing" << endl;
}

int main()
{
    // Person per;
    // Student stu;
    // HignSchoolStu hss;
    // hss.eat();
    // hss.jump();

    // Student * stu_ptr = new(HignSchoolStu);
    // stu_ptr->jump();

    // HHSS HS;
    // HS.speak();
    // HS.eat();

    test(2);

    return 0;
}